package leetcode.数学;

/**
 * 整数转罗马数字(1-3999)
 * 思想：将数字从个十百千四个位置上拆开
 *  然后先对个位的数字解析得到字符
 *  然后对百位的数字解析，依次下去，直到最高位解析结束
 *  每解析一个数字就将结果追加到answer中，解析全部结束，返回answer
 */
public class Test12整数转罗马数字 {

    public static String intToRoman(int num) {
        String answer = "";
        int i = 1, n;  //从个位开始解析
        while (num > 0) {
            n = num % 10;  //表示该数位上的数字
            num /= 10;// 取下一高位上的数字

            // 解析该数位上的数字，获得罗马字符，并追加到answer上
            answer = intToCharacter(n, i).concat(answer);
            i++; //往高位走
        }
        return answer;
    }

    /**
     *
     * @param n 当前进制位上的数
     * @param i 是哪一个进制位，个？十？百？千？
     * @return
     */
    public static String intToCharacter(int n, int i) {
        String str1, str2, str3;
        String answer = "";
        // 针对不同的数位，给组装模板规定对应的罗马数字
        // 比如个位上只需要：I、V、X（特殊的9需要用到X），字符的顺序不可乱，要从小到大排序。
        if (1 == i) {
            str1 = "I";        //个位上的数需要的字符
            str2 = "V";
            str3 = "X";
        } else if (2 == i) {
            str1 = "X";       //十位上的数需要的字符
            str2 = "L";
            str3 = "C";
        } else if (3 == i) {
            str1 = "C";       //百位上的数需要的字符
            str2 = "D";
            str3 = "M";
        } else {
            str1 = "M";     //千位上的数需要的字符，因为最大数到3999，所以str2和str3为空
            str2 = "";
            str3 = "";
        }
        /*
         罗马数字的规律：
         不管数位是在个位还是在百位、千位，
         单个的数字组装的顺序是一样的，只不过需要的模板不一样
         */
        switch (n) {
            case 0:
                break;
            case 1:
                answer += str1;
                break;
            case 2:
                answer += str1 + str1;
                break;
            case 3:
                answer += str1 + str1 + str1;
                break;
            case 4:
                answer += str1 + str2;
                break;
            case 5:
                answer += str2;
                break;
            case 6:
                answer += str2 + str1;
                break;
            case 7:
                answer += str2 + str1 + str1;
                break;
            case 8:
                answer += str2 + str1 + str1 + str1;
                break;
            case 9:
                answer += str1 + str3;
                break;
        }
        return answer;
    }

    public static void main(String[] args) {
        System.out.println(intToRoman(400));
    }
}
